#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;
/*HJJ QQ479287006
 *给定一个非负整数数组 nums ，你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

 

示例 1：

输入：nums = [2,3,1,1,4]
输出：true
解释：可以先跳 1 步，从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2：

输入：nums = [3,2,1,0,4]
输出：false
解释：无论怎样，总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 ， 所以永远不可能到达最后一个下标。

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/jump-game
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */
//这个题 只判断是否能达到最后一个就行
//todo 每次取最⼤跳跃步数（取最⼤覆盖范围），整体最优解：最后得到整体最⼤覆盖范围，看是
// 看看每个元素 覆盖的范围
//bool canJump(vector<int>& nums) {
//
//    int cover=0;
//    for (int i = 0; i <=cover ; ++i) {
//
//        cover = max(maxIndex,i+nums[i]);
//
//    }
//
//    if (cover>=nums.size()-1)
//        return true;
//
//    return false;
//
//}





bool canJump(vector<int>& nums) {

    int maxV=0;

    for (int i = 0; i <nums.size()-1 ; ++i) {
        if(i>maxV) //如果当前遍历的index 大于 能跳到的最大位置
            return false; //上面和下面这个if 存在哪个都行 反正不好想到啊 [1,0,1,0] 专门卡用例

        if(i<=maxV)
            maxV= max(maxV,i+nums[i]);

    }

    return maxV>=nums.size()-1;


}












